﻿using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Capa_Negocio.Gestionar_SalaEnsayo;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Dominio;
using Capa_Negocio;

namespace Capa_TestingProyectsNegocios
{
    [TestFixture]
    public class Test_AdministracionSalaEnsayo
    {
        IApplicationContext Spring = null;
        IAdministracionSalaEnsayo Service = null;
        Local localCreado = null;
        SalaEnsayo salaInscrita = null;
        Distrito distritoCreado = null;
        Servicios serviciosCreado = null;
        ServiciosAdicionales objServiciosAdicionales = null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/capaPersistencia.xml",
                "assembly://Studio7i/Studio7i/capaNegocio.xml"
                );
            // Obtención de la referencia al objeto "administracionSalaEnsayo"
            Service = (IAdministracionSalaEnsayo)Spring.GetObject("AdministracionSalaEnsayo");
            distritoCreado = ((IDistrito)Spring.GetObject("distritoDAO_NH")).Crear(
               new Distrito() { NombreDistrito="Villa el Salvador", Estado = true });
            // Creación de un local de pruebas
            localCreado = ((ILocal)Spring.GetObject("localDAO_NH")).Crear(
                new Local() { NombreLocal = "C41", Direccion = "Monterrico",Distrito = distritoCreado,Estado=true });

            // Creación de un servicio de pruebas
            Servicios objServicio = new Servicios();
            objServicio.NombreServicio = "Servicio General";
            objServicio.Descripcion = "General";
            objServicio.Estado = true;

            serviciosCreado = Service.CrearServicios(objServicio);
        }

        [Test]
        public void Test1_InscribirSala_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CodigoLocal, 30, null,true,"",true);
            });
        }

        [Test]
        public void Test2_InscribirSala_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                salaInscrita = Service.InscribirSala("E43A Rocks!", localCreado.CodigoLocal, 30, ".NET Students", true, "", true);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(salaInscrita);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(salaInscrita.CodigoSala, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(salaInscrita.NombreSala, "E43A Rocks!");
            Assert.AreEqual(salaInscrita.Local.CodigoLocal, localCreado.CodigoLocal);
            Assert.AreEqual(salaInscrita.Capacidad, 30);
            Assert.AreEqual(salaInscrita.Caracteristicas, ".NET Students");
        }

        [Test]
        public void Test3_InscribirSala_Repetida()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CodigoLocal, 30, ".NET Students", true, "", true);
            });
        }

        [Test]
        public void Test4_RegistrarServiciosAdicionales_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarServiciosAdicionales(serviciosCreado.CodigoServicio, salaInscrita.CodigoSala, null, true);
            });


        }

        [Test]
        public void Test5_RegistrarServiciosAdicionales_OK()
        {
            Assert.DoesNotThrow(delegate
            {
                objServiciosAdicionales = Service.RegistrarServiciosAdicionales(serviciosCreado.CodigoServicio, salaInscrita.CodigoSala, "Prueba", true);
            });

            Assert.IsNotNull(objServiciosAdicionales);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(objServiciosAdicionales.CodigoServicioAdicional, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(objServiciosAdicionales.Servicios.CodigoServicio, serviciosCreado.CodigoServicio);
            Assert.AreEqual(objServiciosAdicionales.Observacion, "Prueba");
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            // Eliminamos la sala inscrita
            ((ISalaEnsayo)Spring.GetObject("salaDAO_NH")).Eliminar(salaInscrita);
            // Eliminamos el local de prueba creado inicialmente
            ((ILocal)Spring.GetObject("localDAO_NH")).Eliminar(localCreado);

            ((IServiciosAdicionales)Spring.GetObject("serviciosAdicionalesDAO_NH")).Eliminar(objServiciosAdicionales);
            // Eliminamos el servicio de prueba creado inicialmente
            Service.EliminarServicios(serviciosCreado);
            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;
        }
    }
}
